from sentence_transformers import SentenceTransformer, util
import torch
from typing import List, Optional

# 步骤 1: 加载模型 (这个过程通常较慢，整个程序只需执行一次)
print("正在加载模型...")
model = SentenceTransformer('shibing624/text2vec-base-chinese')
print("模型加载完成。")

def find_best_match(
        input_sentence: str,
        standard_sentences
) -> Optional[str]:
    """
    在标准语句库中，为输入语句寻找语义最相似的句子。
    这个函数负责编码、计算相似度、并根据阈值返回最佳匹配项。
    参数:
    - input_sentence (str): 需要匹配的输入语句。
    - standard_sentences (List[str]): 用于匹配的标准语句列表。
    - model (SentenceTransformer): 已经加载的句向量模型。

    返回:
    - Optional[str]: 如果找到相似度超过阈值的句子，则返回最匹配的那一句（字符串）；否则返回 None。
    """
    # 1. 对所有句子进行编码
    embedding_input = model.encode(input_sentence, convert_to_tensor=True)
    embeddings_standard = model.encode(standard_sentences, convert_to_tensor=True)
    # 2. 计算输入语句与库中所有语句的余弦相似度
    cosine_scores = util.cos_sim(embedding_input, embeddings_standard)
    # 3. 从得分中找出最高分和它的位置（索引）
    # 我们只有一个输入，所以直接处理 cosine_scores 的第一行
    highest_score_tensor, best_match_index_tensor = torch.max(cosine_scores[0], dim=0)
    # 从 tensor 中提取数值
    highest_score = highest_score_tensor.item()
    best_match_index = best_match_index_tensor.item()
    # 如果超过，返回标准库中对应索引的句子
    return standard_sentences[best_match_index],highest_score


# --- 主程序与测试用例 ---
# if __name__ == "__main__":
#     # 模拟一个FAQ（常见问题）知识库，作为标准句子列表
#     faq_library = [
#         "成都有哪些值得去的景点？",
#         "去九寨沟的最佳旅游时间是什么时候？",
#         "乐山大佛的门票多少钱？",
#         "从成都到峨眉山怎么走最方便？",
#         "四川有什么特色美食推荐吗？"
#     ]
#
#     print("\n--- 标准问题库 ---")
#     for q in faq_library:
#         print(f"- {q}")
#     print("---------------------\n")
#
#     # 定义一组测试用例
#     test_cases = [
#         # 测试用例 1: 高度相似，同义词替换
#         "成都附近有什么好玩的地方？",
#
#         # 测试用例 2: 包含部分关键词，但意图明确
#         "九寨沟啥时候去比较好",
#
#         # 测试用例 3: 意图明确，但措辞口语化
#         "去峨眉山咋走",
#
#         # 测试用例 4: 包含实体，但问题不同
#         "乐山大佛的历史背景是什么？",
#
#         # 测试用例 5: 完全不相关的问题
#         "今天天气怎么样？",
#
#         # 测试用例 6: 包含错别字
#         "四川有啥好吃的特产"
#     ]
#
#     # 遍历测试用例并执行匹配
#     for i, user_query in enumerate(test_cases):
#         best_match, score = find_best_match(user_query, faq_library)
#
#         print(f"--- 测试 {i + 1} ---")
#         print(f"用户输入: '{user_query}'")
#         print(f"最佳匹配: '{best_match}'")
#         print(f"相似度得分: {score:.4f}\n")

